home *** CD-ROM | disk | FTP | other *** search
/ PC Plus SuperCD (UK) 1998 August / PC Plus SuperCD 50a Issue 142 (CD142a) (August 1998).iso / trial / demon / TURNPIKE.1 / CLASSES.ZIP / JAVA / UTIL / Hashtable.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-04-14  |  2.8 KB  |  217 lines

  1. package java.util;
  2.  
  3. public class Hashtable extends Dictionary implements Cloneable {
  4.    private HashtableEntry[] table;
  5.    private int count;
  6.    private int threshold;
  7.    private float loadFactor;
  8.  
  9.    public Hashtable(int var1, float var2) {
  10.       if (var1 > 0 && !((double)var2 <= (double)0.0F)) {
  11.          this.loadFactor = var2;
  12.          this.table = new HashtableEntry[var1];
  13.          this.threshold = (int)((float)var1 * var2);
  14.       } else {
  15.          throw new IllegalArgumentException();
  16.       }
  17.    }
  18.  
  19.    public Hashtable(int var1) {
  20.       this(var1, 0.75F);
  21.    }
  22.  
  23.    public Hashtable() {
  24.       this(101, 0.75F);
  25.    }
  26.  
  27.    public int size() {
  28.       return this.count;
  29.    }
  30.  
  31.    public boolean isEmpty() {
  32.       return this.count == 0;
  33.    }
  34.  
  35.    public synchronized Enumeration keys() {
  36.       return new HashtableEnumerator(this.table, true);
  37.    }
  38.  
  39.    public synchronized Enumeration elements() {
  40.       return new HashtableEnumerator(this.table, false);
  41.    }
  42.  
  43.    public synchronized boolean contains(Object var1) {
  44.       if (var1 == null) {
  45.          throw new NullPointerException();
  46.       } else {
  47.          HashtableEntry[] var2 = this.table;
  48.          int var3 = var2.length;
  49.  
  50.          while(var3-- > 0) {
  51.             for(HashtableEntry var4 = var2[var3]; var4 != null; var4 = var4.next) {
  52.                if (var4.value.equals(var1)) {
  53.                   return true;
  54.                }
  55.             }
  56.          }
  57.  
  58.          return false;
  59.       }
  60.    }
  61.  
  62.    public synchronized boolean containsKey(Object var1) {
  63.       HashtableEntry[] var2 = this.table;
  64.       int var3 = var1.hashCode();
  65.       int var4 = (var3 & Integer.MAX_VALUE) % var2.length;
  66.  
  67.       for(HashtableEntry var5 = var2[var4]; var5 != null; var5 = var5.next) {
  68.          if (var5.hash == var3 && var5.key.equals(var1)) {
  69.             return true;
  70.          }
  71.       }
  72.  
  73.       return false;
  74.    }
  75.  
  76.    public synchronized Object get(Object var1) {
  77.       HashtableEntry[] var2 = this.table;
  78.       int var3 = var1.hashCode();
  79.       int var4 = (var3 & Integer.MAX_VALUE) % var2.length;
  80.  
  81.       for(HashtableEntry var5 = var2[var4]; var5 != null; var5 = var5.next) {
  82.          if (var5.hash == var3 && var5.key.equals(var1)) {
  83.             return var5.value;
  84.          }
  85.       }
  86.  
  87.       return null;
  88.    }
  89.  
  90.    protected void rehash() {
  91.       int var1 = this.table.length;
  92.       HashtableEntry[] var2 = this.table;
  93.       int var3 = var1 * 2 + 1;
  94.       HashtableEntry[] var4 = new HashtableEntry[var3];
  95.       this.threshold = (int)((float)var3 * this.loadFactor);
  96.       this.table = var4;
  97.       int var5 = var1;
  98.  
  99.       HashtableEntry var7;
  100.       int var8;
  101.       while(var5-- > 0) {
  102.          for(HashtableEntry var6 = var2[var5]; var6 != null; var4[var8] = var7) {
  103.             var7 = var6;
  104.             var6 = var6.next;
  105.             var8 = (var7.hash & Integer.MAX_VALUE) % var3;
  106.             var7.next = var4[var8];
  107.          }
  108.       }
  109.  
  110.    }
  111.  
  112.    public synchronized Object put(Object var1, Object var2) {
  113.       if (var2 == null) {
  114.          throw new NullPointerException();
  115.       } else {
  116.          HashtableEntry[] var3 = this.table;
  117.          int var4 = var1.hashCode();
  118.          int var5 = (var4 & Integer.MAX_VALUE) % var3.length;
  119.  
  120.          for(HashtableEntry var6 = var3[var5]; var6 != null; var6 = var6.next) {
  121.             if (var6.hash == var4 && var6.key.equals(var1)) {
  122.                Object var7 = var6.value;
  123.                var6.value = var2;
  124.                return var7;
  125.             }
  126.          }
  127.  
  128.          if (this.count >= this.threshold) {
  129.             this.rehash();
  130.             return this.put(var1, var2);
  131.          } else {
  132.             HashtableEntry var8 = new HashtableEntry();
  133.             var8.hash = var4;
  134.             var8.key = var1;
  135.             var8.value = var2;
  136.             var8.next = var3[var5];
  137.             var3[var5] = var8;
  138.             ++this.count;
  139.             return null;
  140.          }
  141.       }
  142.    }
  143.  
  144.    public synchronized Object remove(Object var1) {
  145.       HashtableEntry[] var2 = this.table;
  146.       int var3 = var1.hashCode();
  147.       int var4 = (var3 & Integer.MAX_VALUE) % var2.length;
  148.       HashtableEntry var5 = var2[var4];
  149.  
  150.       for(HashtableEntry var6 = null; var5 != null; var5 = var5.next) {
  151.          if (var5.hash == var3 && var5.key.equals(var1)) {
  152.             if (var6 != null) {
  153.                var6.next = var5.next;
  154.             } else {
  155.                var2[var4] = var5.next;
  156.             }
  157.  
  158.             --this.count;
  159.             return var5.value;
  160.          }
  161.  
  162.          var6 = var5;
  163.       }
  164.  
  165.       return null;
  166.    }
  167.  
  168.    public synchronized void clear() {
  169.       HashtableEntry[] var1 = this.table;
  170.       int var2 = var1.length;
  171.  
  172.       while(true) {
  173.          --var2;
  174.          if (var2 < 0) {
  175.             this.count = 0;
  176.             return;
  177.          }
  178.  
  179.          var1[var2] = null;
  180.       }
  181.    }
  182.  
  183.    public synchronized Object clone() {
  184.       try {
  185.          Hashtable var1 = (Hashtable)super.clone();
  186.          var1.table = new HashtableEntry[this.table.length];
  187.  
  188.          for(int var2 = this.table.length; var2-- > 0; var1.table[var2] = this.table[var2] != null ? (HashtableEntry)this.table[var2].clone() : null) {
  189.          }
  190.  
  191.          return var1;
  192.       } catch (CloneNotSupportedException var3) {
  193.          throw new InternalError();
  194.       }
  195.    }
  196.  
  197.    public synchronized String toString() {
  198.       int var1 = this.size() - 1;
  199.       StringBuffer var2 = new StringBuffer();
  200.       Enumeration var3 = this.keys();
  201.       Enumeration var4 = this.elements();
  202.       var2.append("{");
  203.  
  204.       for(int var5 = 0; var5 <= var1; ++var5) {
  205.          String var6 = var3.nextElement().toString();
  206.          String var7 = var4.nextElement().toString();
  207.          var2.append(var6 + "=" + var7);
  208.          if (var5 < var1) {
  209.             var2.append(", ");
  210.          }
  211.       }
  212.  
  213.       var2.append("}");
  214.       return new String(var2);
  215.    }
  216. }
  217.